package scr 
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.external.ExternalInterface;
	import flash.net.SharedObject;
	import flash.utils.Timer;
	import ru.gosoplata.model.Cookie;
	import ru.gosoplata.model.TmpModel;
	CONFIG::debug {import ru.gosoplata.debug.TimeOutView;}
	/**
	 * TODO: в папке scr не место  классу ScreenController
	 * @author a.orleansky
	 */
	public class ScreenController
	{
		private const _scrStack:Array = new Array();
		
		/* TODO: 	никак определить где запущен флэш пока нельзя)
					Sergey Klimenko: Будут не туалетными. Но я думаю, что из этого ничего не выйдет, это тебе ковыряния и отладки на год как минимум.
					...он в меня прям "верит-верит"!
					
					используется для 
					- смены логотипа.
					- оферта.
					- кнопка сервисного меню.
		*/
		//public static const PROFILE_STANDART:String = "standart";
		//public static var PROFILE_WC:String = "wc";
		//public static var CURRENT_PROFILE:String = PROFILE_STANDART;
		
		private var _curr_screen:String;
		private var _conteiner:Sprite;
		
		private var _inactivityTimeOut:Timer = new Timer(1000, 999999);
		CONFIG::debug {private var _timeOutView:TimeOutView = new TimeOutView();}
		private var _goIndex:Boolean=false;
		
		public function ScreenController() 
		{
			if (CONFIG::debug)_inactivityTimeOut.addEventListener(TimerEvent.TIMER, onTime);
			_inactivityTimeOut.addEventListener(TimerEvent.TIMER_COMPLETE, onTimeOut);
		}
		
		public function gotoBack():void 
		{
			if (_scrStack.length > 1)
			{
				_scrStack.pop();
				var nm:String = _scrStack.pop();
				if (nm == "choose_provider") //TODO: переделать бэк полностью!
				{
					while (nm=="choose_provider") 
					{
						nm = _scrStack.pop();
					}
					var tmpNm:String = nm;
					nm = "choose_provider";
					if (TmpModel.payment.provider.folder == "all") nm = "index_services";
					if(tmpNm!=nm)_scrStack.push(nm);
					TmpModel.payment.toProvider(TmpModel.payment.provider.folder);
				}
				showScreenByName(nm);
			}else {
				gotoIndexHTML();
			}
		}
		
		public function lock():void 
		{
			if (_conteiner)_conteiner.getChildByName('blocker').visible = TmpModel.acceptor.lock;
			nullTimer();
		}
		
		public function gotoIndexHTML():void 
		{
			if (TmpModel.acceptor.work) {
				_goIndex = true;
				return;
			}
			
			var cookie:Cookie = new Cookie();
			cookie.operationID = TmpModel.payment.payBack>0?TmpModel.payment.operation:"";
			TmpModel.cookieService.writeCookie(cookie);
			
			var sharedObject:SharedObject = SharedObject.getLocal('paymentData');
			sharedObject.clear();
			//TODO: saveData - почему нельзя записывать сразу объект?
			sharedObject.data.operation = TmpModel.payment.saveData.operation;
			sharedObject.data.pages = TmpModel.payment.saveData.pages;
			sharedObject.data.actions = TmpModel.payment.saveData.actions;
			sharedObject.data.payBack = TmpModel.payment.saveData.payBack;
			sharedObject.flush();
			
			_inactivityTimeOut.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimeOut);
			
			if (CONFIG::debug) 
			{
				TmpModel.debugOutput.add('Для отладки переход на index отложен. Клик для продолжения ...');
				_conteiner.addEventListener(MouseEvent.CLICK, goIndex);
			}else 
			{
				goIndex();
			}
		}
		
		public function initController(cont:Sprite):void 
		{
			_conteiner = cont;
			_conteiner.addEventListener(MouseEvent.CLICK, nullTimer);
			
			new InitScreens();
			if (CONFIG::debug) 
			{
				_timeOutView.x = _conteiner.width - _timeOutView.width;
				_conteiner.addChild(_timeOutView);
			}
		}
		
		public function showScreenByName(_name:String):void 
		{
			if (_name == "index") 
			{
				gotoIndexHTML();
				return;
			}
			
			nullTimer();
			
			var o:Object = { search:1,  wc_direction:1, info:1, oferta:1, wc_login:1, wc_servise:1, exchstart:1, coinout:1, finish_pay:1, ssp_select_change:1 };//confirm_phone:1,
			if (!o[_name])_scrStack.push(_name);
			
			if(_curr_screen)_conteiner.getChildByName(_curr_screen).visible = false;
			
			try 
			{
				_conteiner.getChildByName(_name).visible = true;
				_curr_screen = _name;
			}catch (err:Error)
			{
				TmpModel.acceptor.writeLog("ScreenController showScreenByName ERROR: no exist page '" + _name + "'.");
				gotoIndexHTML();
				return;
			}
			
			var delay:uint = 3*60;
			//TODO: ну не красиво же!
			var obj:Object = {
								//index_services		:,
								//enter_phone			:,
								//enter_userdata		:,
								//confirm_phone		:,
								//confirm_userdata	:,
								//choose_provider		:,
								pay					: 60,
								//finish_pay			: ,
								//search				:,
								//info				:,
								//oferta				:,
								wc_direction		: 10000,//свой
								//wc_closed			:,
								//coinout				: ,// возможно понадобится - проверить... деньги может выдавать до 40 сек - таумает у ехе
								//enter_exchange_code	:,
								//wc_login			:,
								wc_servise			: 999999999
							};
			if (obj[_curr_screen]) delay = obj[_curr_screen];
			_inactivityTimeOut.repeatCount = delay;
			if (CONFIG::debug) onTime();
			
			TmpModel.acceptor.writeLog("showScreenByName "+_curr_screen);
			(_conteiner.getChildByName(_curr_screen) as IScreen).reDraw();
			
			lock();
		}
		
		//TODO: почти атовизм - и славно!
		public function getConteiner():Sprite 
		{
			return _conteiner;
		}
		
		public function endWork():void 
		{
			if (_goIndex) gotoIndexHTML();
		}
		
		public function goIndex(e:MouseEvent=null):void 
		{
			TmpModel.acceptor.closeConnection();
			ExternalInterface.call("function(){location.href = './index.html'}");
		}
		
		private function nullTimer(e:MouseEvent = null):void 
		{
			_inactivityTimeOut.reset();
			if(!TmpModel.acceptor.lock)_inactivityTimeOut.start();
			if (CONFIG::debug) onTime();
		}
		
		private function onTimeOut(e:TimerEvent):void 
		{
			TmpModel.debugOutput.add('+++++++++++++++++++++++++++++++++++ onTimeOut +++++++++++++++++++++++++++++++++++');
			TmpModel.acceptor.writeLog('end by Time Out');
			
			TmpModel.payment.timeoutPay();
			TmpModel.tmpGlobalController.controllerFinishPay();
			
			if (CONFIG::debug) _inactivityTimeOut.removeEventListener(TimerEvent.TIMER, onTime);
			_inactivityTimeOut.removeEventListener(TimerEvent.TIMER_COMPLETE, onTimeOut);
		}
		
		CONFIG::debug{ 
		private function onTime(e:TimerEvent=null):void 
		{
			_timeOutView.time = _inactivityTimeOut.repeatCount - _inactivityTimeOut.currentCount;
		}
		}
		
		public function get curr_screen():String 
		{
			return _curr_screen;
		}
	}
}